package leetcode._08_dynic;

import org.junit.Test;

/**
 * @author pppppp
 * @date 2022/4/9 21:10
 * 一条包含字母 A-Z 的消息通过以下映射进行了 编码 ：
 * <p>
 * 'A' -> "1"
 * 'B' -> "2"
 * ...
 * 'Z' -> "26"
 * 要 解码 已编码的消息，所有数字必须基于上述映射的方法，反向映射回字母（可能有多种方法）。例如，"11106" 可以映射为：
 * "AAJF" ，将消息分组为 (1 1 10 6)
 * "KJF" ，将消息分组为 (11 10 6)
 * 注意，消息不能分组为  (1 11 06) ，因为 "06" 不能映射为 "F" ，这是由于 "6" 和 "06" 在映射中并不等价。
 * 给你一个只含数字的 非空 字符串 s ，请计算并返回 解码 方法的 总数 。
 * 题目数据保证答案肯定是一个 32 位 的整数。
 * <p>
 * 示例 1：
 * 输入：s = "12"
 * 输出：2
 * 解释：它可以解码为 "AB"（1 2）或者 "L"（12）。
 * <p>
 * 示例 2：
 * 输入：s = "226"
 * 输出：3
 * 解释：它可以解码为 "BZ" (2 26), "VF" (22 6), 或者 "BBF" (2 2 6) 。
 * <p>
 * 示例 3：
 * 输入：s = "0"
 * 输出：0
 * 解释：没有字符映射到以 0 开头的数字。
 * 含有 0 的有效映射是 'J' -> "10" 和 'T'-> "20" 。
 * 由于没有字符，因此没有有效的方法对此进行解码，因为所有数字都需要映射。
 * <p>
 * 提示：
 * 1 <= s.length <= 100
 * s 只包含数字，并且可能包含前导零。
 */
public class _91_解码方法 {
    @Test
    public void T_0() {
        String[] s = {"3301","1201234", "2101", "12", "226", "0","100",};
        int[] ans = {0,3, 1, 2, 3, 0,0};
        for (int i = 0; i < s.length; i++) {
            // System.out.println(numDecodings(s[i]) == ans[i]);
            System.out.println(numDecodings_1(s[i]) == ans[i]);
        }
    }
    public int numDecodings_1(String s) {
        int n = s.length();
        int[] f = new int[n + 1];
        f[0] = 1;
        for (int i = 1; i <= n; ++i) {
            if (s.charAt(i - 1) != '0') {
                f[i] += f[i - 1];
            }
            if (i > 1 && s.charAt(i - 2) != '0' && ((s.charAt(i - 2) - '0') * 10 + (s.charAt(i - 1) - '0') <= 26)) {
                f[i] += f[i - 2];
            }
        }
        return f[n];
    }


    /*dp + 多条件判断*/
    public int numDecodings(String s) {
        if (s.startsWith("0")
                || s.indexOf("00") != -1
                || s.indexOf("30") != -1
                || s.indexOf("40") != -1
                || s.indexOf("50") != -1
                || s.indexOf("60") != -1
                || s.indexOf("70") != -1
                || s.indexOf("80") != -1
                || s.indexOf("90") != -1
        ) {
            return 0;
        }
        if (s.length() == 1) {
            return 1;
        }
        int[] dp = new int[s.length()];
        dp[0] = 1;
        dp[1] = s.length() > 2 && s.charAt(2) == '0' || s.charAt(1) == '0' || Integer.valueOf(s.substring(0, 2)) > 26 ? 1 : 2;
        for (int i = 2; i < s.length(); i++) {
            String last2ch = s.substring(i - 1, i + 1);
            if (i < s.length() - 1 && s.charAt(i + 1) == '0'
                    || s.charAt(i) == '0'
                    || s.charAt(i-1) == '0'
                    || Integer.valueOf(last2ch) > 26) {
                dp[i] = dp[i - 1];
            } else {
                dp[i] = dp[i - 1] + dp[i - 2];
            }
        }
        return dp[s.length() - 1];
    }


}
